<!DOCTYPE html><html lang="zh-CN" data-theme="dark"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"><title>面试题--Java | SodaSoda</title><meta name="author" content="ShiMH"><meta name="copyright" content="ShiMH"><meta name="format-detection" content="telephone=no"><meta name="theme-color" content="#0d0d0d"><meta name="description" content="1.Java语言的特点 ​	面向对象（封装，继承，多态） ​	平台无关性（Java虚拟机） ​	支持多线程  2. JVM  JRE  JDK​	Java 虚拟机（JVM）是运行 Java 字节码的虚拟机。JVM 有针对不同系统的特定实现（Windows，Linux，macOS），目的是使用相同的字节码，它们都会给出相同的结果。字节码和不同系统的 JVM 实现是 Java 语言“一次编译，随处可以">
<meta property="og:type" content="article">
<meta property="og:title" content="面试题--Java">
<meta property="og:url" content="https://soda124.gitee.io/articles/5920252e.html">
<meta property="og:site_name" content="SodaSoda">
<meta property="og:description" content="1.Java语言的特点 ​	面向对象（封装，继承，多态） ​	平台无关性（Java虚拟机） ​	支持多线程  2. JVM  JRE  JDK​	Java 虚拟机（JVM）是运行 Java 字节码的虚拟机。JVM 有针对不同系统的特定实现（Windows，Linux，macOS），目的是使用相同的字节码，它们都会给出相同的结果。字节码和不同系统的 JVM 实现是 Java 语言“一次编译，随处可以">
<meta property="og:locale" content="zh_CN">
<meta property="og:image" content="https://soda124.gitee.io/img/star.jpeg">
<meta property="article:published_time" content="2022-06-21T00:30:56.000Z">
<meta property="article:modified_time" content="2022-06-30T07:49:55.926Z">
<meta property="article:author" content="ShiMH">
<meta name="twitter:card" content="summary">
<meta name="twitter:image" content="https://soda124.gitee.io/img/star.jpeg"><link rel="shortcut icon" href="/img/favicon.png"><link rel="canonical" href="https://soda124.gitee.io/articles/5920252e"><link rel="preconnect" href="//cdn.jsdelivr.net"/><link rel="stylesheet" href="/css/index.css"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6/css/all.min.css" media="print" onload="this.media='all'"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fancyapps/ui/dist/fancybox.css" media="print" onload="this.media='all'"><script>const GLOBAL_CONFIG = { 
  root: '/',
  algolia: undefined,
  localSearch: undefined,
  translate: undefined,
  noticeOutdate: undefined,
  highlight: {"plugin":"highlighjs","highlightCopy":true,"highlightLang":true,"highlightHeightLimit":false},
  copy: {
    success: '复制成功',
    error: '复制错误',
    noSupport: '浏览器不支持'
  },
  relativeDate: {
    homepage: false,
    post: false
  },
  runtime: '',
  date_suffix: {
    just: '刚刚',
    min: '分钟前',
    hour: '小时前',
    day: '天前',
    month: '个月前'
  },
  copyright: undefined,
  lightbox: 'fancybox',
  Snackbar: undefined,
  source: {
    justifiedGallery: {
      js: 'https://cdn.jsdelivr.net/npm/flickr-justified-gallery@2/dist/fjGallery.min.js',
      css: 'https://cdn.jsdelivr.net/npm/flickr-justified-gallery@2/dist/fjGallery.min.css'
    }
  },
  isPhotoFigcaption: false,
  islazyload: true,
  isAnchor: false
}</script><script id="config-diff">var GLOBAL_CONFIG_SITE = {
  title: '面试题--Java',
  isPost: true,
  isHome: false,
  isHighlightShrink: false,
  isToc: true,
  postUpdate: '2022-06-30 15:49:55'
}</script><noscript><style type="text/css">
  #nav {
    opacity: 1
  }
  .justified-gallery img {
    opacity: 1
  }

  #recent-posts time,
  #post-meta time {
    display: inline !important
  }
</style></noscript><script>(win=>{
    win.saveToLocal = {
      set: function setWithExpiry(key, value, ttl) {
        if (ttl === 0) return
        const now = new Date()
        const expiryDay = ttl * 86400000
        const item = {
          value: value,
          expiry: now.getTime() + expiryDay,
        }
        localStorage.setItem(key, JSON.stringify(item))
      },

      get: function getWithExpiry(key) {
        const itemStr = localStorage.getItem(key)

        if (!itemStr) {
          return undefined
        }
        const item = JSON.parse(itemStr)
        const now = new Date()

        if (now.getTime() > item.expiry) {
          localStorage.removeItem(key)
          return undefined
        }
        return item.value
      }
    }
  
    win.getScript = url => new Promise((resolve, reject) => {
      const script = document.createElement('script')
      script.src = url
      script.async = true
      script.onerror = reject
      script.onload = script.onreadystatechange = function() {
        const loadState = this.readyState
        if (loadState && loadState !== 'loaded' && loadState !== 'complete') return
        script.onload = script.onreadystatechange = null
        resolve()
      }
      document.head.appendChild(script)
    })
  
      win.activateDarkMode = function () {
        document.documentElement.setAttribute('data-theme', 'dark')
        if (document.querySelector('meta[name="theme-color"]') !== null) {
          document.querySelector('meta[name="theme-color"]').setAttribute('content', '#0d0d0d')
        }
      }
      win.activateLightMode = function () {
        document.documentElement.setAttribute('data-theme', 'light')
        if (document.querySelector('meta[name="theme-color"]') !== null) {
          document.querySelector('meta[name="theme-color"]').setAttribute('content', '#ffffff')
        }
      }
      const t = saveToLocal.get('theme')
    
          if (t === 'dark') activateDarkMode()
          else if (t === 'light') activateLightMode()
        
      const asideStatus = saveToLocal.get('aside-status')
      if (asideStatus !== undefined) {
        if (asideStatus === 'hide') {
          document.documentElement.classList.add('hide-aside')
        } else {
          document.documentElement.classList.remove('hide-aside')
        }
      }
    
    const detectApple = () => {
      if(/iPad|iPhone|iPod|Macintosh/.test(navigator.userAgent)){
        document.documentElement.classList.add('apple')
      }
    }
    detectApple()
    })(window)</script><link rel="stylesheet" href="/css/universe.css"><link rel="stylesheet" href="/css/custom.css"><!-- hexo injector head_end start --><link rel="stylesheet" href="https://unpkg.zhimg.com/hexo-butterfly-clock/lib/clock.min.css" /><!-- hexo injector head_end end --><meta name="generator" content="Hexo 6.2.0"></head><body><div id="loading-box"><div class="loading-left-bg"></div><div class="loading-right-bg"></div><div class="wizard-scene"><div class="wizard-objects"><div class="wizard-square"></div><div class="wizard-circle"></div><div class="wizard-triangle"></div></div><div class="wizard"><div class="wizard-body"></div><div class="wizard-right-arm"><div class="wizard-right-hand"></div></div><div class="wizard-left-arm"><div class="wizard-left-hand"></div></div><div class="wizard-head"><div class="wizard-beard"></div><div class="wizard-face"><div class="wizard-adds"></div></div><div class="wizard-hat"><div class="wizard-hat-of-the-hat"></div><div class="wizard-four-point-star --first"></div><div class="wizard-four-point-star --second"></div><div class="wizard-four-point-star --third"></div></div></div></div></div></div><div id="web_bg"></div><div id="sidebar"><div id="menu-mask"></div><div id="sidebar-menus"><div class="avatar-img is-center"><img src= "/img/cat-loading.gif" data-lazy-src="/img/profileIcon.jpg" onerror="onerror=null;src='/img/friend_404.gif'" alt="avatar"/></div><div class="sidebar-site-data site-data is-center"><a href="/archives/"><div class="headline">文章</div><div class="length-num">9</div></a><a href="/tags/"><div class="headline">标签</div><div class="length-num">0</div></a><a href="/categories/"><div class="headline">分类</div><div class="length-num">5</div></a></div><hr/><div class="menus_items"><div class="menus_item"><a class="site-page" href="/"><i class="fa-fw fa fa-home"></i><span> 首页</span></a></div><div class="menus_item"><a class="site-page" href="/archives/"><i class="fa-fw fa fa-archive"></i><span> 时间轴</span></a></div><div class="menus_item"><a class="site-page" href="/categories/"><i class="fa-fw fa fa-folder-open"></i><span> 分类</span></a></div><div class="menus_item"><a class="site-page" href="/link/"><i class="fa-fw fa fa-link"></i><span> 友链</span></a></div><div class="menus_item"><a class="site-page" href="/about/"><i class="fa-fw fa fa-sitemap"></i><span> 菜单</span></a></div></div></div></div><div class="post" id="body-wrap"><header class="post-bg" id="page-header" style="background-image: url('/img/star.jpeg')"><nav id="nav"><span id="blog_name"><a id="site-name" href="/">SodaSoda</a></span><div id="menus"><div class="menus_items"><div class="menus_item"><a class="site-page" href="/"><i class="fa-fw fa fa-home"></i><span> 首页</span></a></div><div class="menus_item"><a class="site-page" href="/archives/"><i class="fa-fw fa fa-archive"></i><span> 时间轴</span></a></div><div class="menus_item"><a class="site-page" href="/categories/"><i class="fa-fw fa fa-folder-open"></i><span> 分类</span></a></div><div class="menus_item"><a class="site-page" href="/link/"><i class="fa-fw fa fa-link"></i><span> 友链</span></a></div><div class="menus_item"><a class="site-page" href="/about/"><i class="fa-fw fa fa-sitemap"></i><span> 菜单</span></a></div></div><div id="toggle-menu"><a class="site-page"><i class="fas fa-bars fa-fw"></i></a></div></div></nav><div id="post-info"><h1 class="post-title">面试题--Java</h1><div id="post-meta"><div class="meta-firstline"><span class="post-meta-date"><i class="far fa-calendar-alt fa-fw post-meta-icon"></i><span class="post-meta-label">发表于</span><time class="post-meta-date-created" datetime="2022-06-21T00:30:56.000Z" title="发表于 2022-06-21 08:30:56">2022-06-21</time><span class="post-meta-separator">|</span><i class="fas fa-history fa-fw post-meta-icon"></i><span class="post-meta-label">更新于</span><time class="post-meta-date-updated" datetime="2022-06-30T07:49:55.926Z" title="更新于 2022-06-30 15:49:55">2022-06-30</time></span><span class="post-meta-categories"><span class="post-meta-separator">|</span><i class="fas fa-inbox fa-fw post-meta-icon"></i><a class="post-meta-categories" href="/categories/%E9%9D%A2%E8%AF%95/">面试</a></span></div><div class="meta-secondline"><span class="post-meta-separator">|</span><span class="post-meta-wordcount"><i class="far fa-file-word fa-fw post-meta-icon"></i><span class="post-meta-label">字数总计:</span><span class="word-count">3.9k</span><span class="post-meta-separator">|</span><i class="far fa-clock fa-fw post-meta-icon"></i><span class="post-meta-label">阅读时长:</span><span>12分钟</span></span></div></div></div></header><main class="layout" id="content-inner"><div id="post"><article class="post-content" id="article-container"><h4 id="1-Java语言的特点"><a href="#1-Java语言的特点" class="headerlink" title="1.Java语言的特点"></a>1.Java语言的特点</h4><ul>
<li>​	面向对象（封装，继承，多态）</li>
<li>​	平台无关性（Java虚拟机）</li>
<li>​	支持多线程</li>
</ul>
<h4 id="2-JVM-JRE-JDK"><a href="#2-JVM-JRE-JDK" class="headerlink" title="2. JVM  JRE  JDK"></a>2. JVM  JRE  JDK</h4><p>​	Java 虚拟机（JVM）是运行 Java 字节码的虚拟机。JVM 有针对不同系统的特定实现（Windows，Linux，macOS），目的是使用相同的字节码，它们都会给出相同的结果。字节码和不同系统的 JVM 实现是 Java 语言“一次编译，随处可以运行”的关键所在。</p>
<p>​	JDK 是 Java Development Kit 缩写，它是功能齐全的 Java SDK。它拥有 JRE 所拥有的一切，还有编译器（javac）和工具（如 javadoc 和 jdb）。它能够创建和编译程序。</p>
<p>​	JRE 是 Java 运行时环境。它是运行已编译 Java 程序所需的所有内容的集合，包括 Java 虚拟机（JVM），Java 类库，java 命令和其他的一些基础构件。但是，它不能用于创建新程序。</p>
<blockquote>
<p>如果你只是为了运行一下 Java 程序的话，只需要安装 JRE 就可以了。如果需要进行一些 Java 编程方面的工作，那么就需要安装 JDK 了</p>
</blockquote>
<p><strong>为什么说 Java 语言“编译与解释并存”？</strong></p>
<p>​	这是因为 Java 语言既具有编译型语言的特征，也具有解释型语言的特征。因为 Java 程序要经过先编译，后解释两个步骤，由 Java 编写的程序需要先经过编译步骤，生成字节码（.class 文件），这种字节码必须由 Java 解释器来解释执行。</p>
<h4 id="3-Java和C-的区别"><a href="#3-Java和C-的区别" class="headerlink" title="3. Java和C++的区别"></a>3. Java和C++的区别</h4><ul>
<li>Java 不提供指针来直接访问内存，程序内存更加安全</li>
<li>Java 的类是单继承的，C++ 支持多重继承；虽然 Java 的类不可以多继承，但是接口可以多继承。</li>
<li>Java 有自动内存管理垃圾回收机制(GC)，不需要程序员手动释放无用内存。</li>
<li>C ++同时支持方法重载和操作符重载，但是 Java 只支持方法重载（操作符重载增加了复杂性，这与 Java 最初的设计思想不符）。</li>
</ul>
<h4 id="4-字符型常量（’-‘）和字符串常量（”-“）的区别"><a href="#4-字符型常量（’-‘）和字符串常量（”-“）的区别" class="headerlink" title="4.字符型常量（’ ‘）和字符串常量（” “）的区别?"></a>4.字符型常量（’ ‘）和字符串常量（” “）的区别?</h4><ol>
<li>形式 : 字符常量是单引号引起的一个字符，字符串常量是双引号引起的 0 个或若干个字符。</li>
<li>含义 : 字符常量相当于一个整型值( ASCII 值),可以参加表达式运算; 字符串常量代表一个地址值(该字符串在内存中存放位置)。</li>
<li>占内存大小 ： 字符常量只占 2 个字节; 字符串常量占若干个字节。</li>
</ol>
<h4 id="5-静态方法为什么不能调用非静态成员"><a href="#5-静态方法为什么不能调用非静态成员" class="headerlink" title="5.静态方法为什么不能调用非静态成员?"></a>5.静态方法为什么不能调用非静态成员?</h4><p>这个需要结合 JVM 的相关知识，主要原因如下：</p>
<ol>
<li>静态方法是属于类的，在类加载的时候就会分配内存，可以通过类名直接访问。而非静态成员属于实例对象，只有在对象实例化之后才存在，需要通过类的实例对象去访问。</li>
<li>在类的非静态成员不存在的时候静态成员就已经存在了，此时调用在内存中还不存在的非静态成员，属于非法操作。</li>
</ol>
<blockquote>
<p>静态方法在访问本类的成员时，只允许访问静态成员（即静态成员变量和静态方法），不允许访问实例成员（即实例成员变量和实例方法），而实例方法不存在这个限制。</p>
</blockquote>
<h4 id="6-基本类型和包装类型的区别？"><a href="#6-基本类型和包装类型的区别？" class="headerlink" title="6.基本类型和包装类型的区别？"></a>6.基本类型和包装类型的区别？</h4><ul>
<li>包装类型不赋值就是 null ，而基本类型有默认值且不是 null。</li>
<li>包装类型可用于泛型，而基本类型不可以。</li>
<li>基本数据类型的局部变量存放在 Java 虚拟机栈中的局部变量表中，基本数据类型的成员变量（未被 static 修饰 ）存放在 Java 虚拟机的堆中。包装类型属于对象类型，我们知道几乎所有对象实例都存在于堆中。</li>
<li>相比于对象类型， 基本数据类型占用的空间非常小。</li>
</ul>
<h4 id="7-包装类型的常量池技术了解么？"><a href="#7-包装类型的常量池技术了解么？" class="headerlink" title="7.包装类型的常量池技术了解么？"></a>7.包装类型的常量池技术了解么？</h4><p>​	Java 基本类型的包装类的大部分都实现了常量池技术。</p>
<p>​	Byte,Short,Integer,Long 这 4 种包装类默认创建了数值 <strong>[-128，127]</strong> 的相应类型的缓存数据，Character 创建了数值在 <strong>[0,127]</strong> 范围的缓存数据，Boolean 直接返回 True or False。</p>
<p>​	两种浮点数类型的包装类 Float,Double 并没有实现常量池技术。</p>
<img src= "/img/cat-loading.gif" data-lazy-src="https://cdn.jsdelivr.net/gh/Monic1e/picb@master/imgForMD/image-20220621084849321.png" alt="image-20220621084849321" style="zoom:67%;" />

<img src= "/img/cat-loading.gif" data-lazy-src="https://cdn.jsdelivr.net/gh/Monic1e/picb@master/imgForMD/image-20220621084903765.png" alt="image-20220621084903765" style="zoom:67%;" />

<img src= "/img/cat-loading.gif" data-lazy-src="https://cdn.jsdelivr.net/gh/Monic1e/picb@master/imgForMD/image-20220621084919798.png" alt="image-20220621084919798" style="zoom:67%;" />

<p><strong>8.面向对象三大特征？</strong></p>
<ol>
<li>封装： 方法中的private对象，指把一个对象的状态信息（也就是属性）隐藏在对象内部，不允许外部对象直接访问。</li>
<li>继承（extends）：抽取父类，使用已存在的类的定义作为基础建立新类的技术，新类的定义可以增加新的数据或新的功能，也可以用父类的功能。通过使用继承，可以快速地创建新的类，可以提高代码的重用，程序的可维护性，节省大量创建新类的时间。</li>
<li>多态：表示一个对象具有多种的状态，具体表现为父类的引用指向子类的实例。</li>
</ol>
<p>​	<strong>多态的特点:</strong></p>
<ul>
<li>对象类型和引用类型之间具有继承（类）&#x2F;实现（接口）的关系；</li>
<li>引用类型变量发出的方法调用的到底是哪个类中的方法，必须在程序运行期间才能确定；</li>
<li>多态不能调用“只在子类存在但在父类不存在”的方法；</li>
<li>如果子类重写了父类的方法，真正执行的是子类覆盖的方法，如果子类没有覆盖父类的方法，执行的是父类的方法。</li>
</ul>
<h4 id="9-x3D-x3D-和-equals-的区别"><a href="#9-x3D-x3D-和-equals-的区别" class="headerlink" title="9.&#x3D;&#x3D; 和 equals() 的区别"></a>9.&#x3D;&#x3D; 和 equals() 的区别</h4><p><strong>&#x3D;&#x3D;</strong> 对于基本类型和引用类型的作用效果是不同的：</p>
<ul>
<li>对于基本数据类型来说，&#x3D;&#x3D; 比较的是值。</li>
<li>对于引用数据类型来说，&#x3D;&#x3D; 比较的是对象的内存地址。</li>
</ul>
<blockquote>
<p>因为 Java 只有值传递，所以，对于 &#x3D;&#x3D; 来说，不管是比较基本数据类型，还是引用数据类型的变量，其本质比较的都是值，只是引用类型变量存的值是对象的地址。</p>
</blockquote>
<p><strong>equals()</strong> 不能用于判断基本数据类型的变量，只能用来判断两个对象是否相等。equals()方法存在于Object类中，而Object类是所有类的直接或间接父类，因此所有的类都有equals()方法。</p>
<p>String 中的 equals 方法是被重写过的，因为 String 的 equals 方法比较的是对象的值。</p>
<p><strong>为什么重写equals时必须重写hashcode方法？</strong></p>
<p>​	hashCode的作用是获取哈希码，这个哈希码的作用是确定该对象在哈希表中的索引位置。Object类中，hashCode函数返回值其实是类对象的内存地址。两个不同对象的内存地址一定是不同的，也就是他们的hash值一定不同，也就永远无法判断两个对象相等了。</p>
<p><strong>解决方法</strong>：重写hashCode，使其返回比如id属性的hashCode，这样能使得id相同的不同对象获得相同的hash值，从而能够判断两个对象相等。</p>
<p>重申一下，如果要在HashMap的“键”部分存放自定义的对象，一定要在这个对象里用自己的equals和hashCode方法来覆盖Object里的同名方法。 </p>
<h4 id="10-String-StringBuffer-StringBuilder"><a href="#10-String-StringBuffer-StringBuilder" class="headerlink" title="10.String StringBuffer  StringBuilder"></a>10.String StringBuffer  StringBuilder</h4><h5 id="1-线程安全性"><a href="#1-线程安全性" class="headerlink" title="1.线程安全性"></a>1.线程安全性</h5><p>​	String 中的对象是不可变的，也就可以理解为常量，线程安全。AbstractStringBuilder 是 StringBuilder 与 StringBuffer 的公共父类，定义了一些字符串的基本操作，如 expandCapacity、append、insert、indexOf 等公共方法。StringBuffer <strong>对方法加了同步锁</strong>或者<strong>对调用的方法加了同步锁</strong>，所以是<strong>线程安全</strong>的。StringBuilder 并没有对方法进行加同步锁，所以是非线程安全的。</p>
<p>​	同步锁（synchronized）的作用是保证在同一时刻， 被修饰的代码块或方法只会有一个线程执行，以达到保证并发安全的效果。</p>
<p>synchronized的作用主要有三个：</p>
<ul>
<li>原子性：确保线程互斥地访问同步代码；</li>
<li>可见性：保证共享变量的修改能够及时可见，其实是通过Java内存模型中的“对一个变量unlock操作之前，必须要同步到主内存中；如果对一个变量进行lock操作，则将会清空工作内存中此变量的值，在执行引擎使用此变量前，需要重新从主内存中load操作或assign操作初始化变量值”来保证的；</li>
<li>有序性：有效解决重排序问题，即 “一个unlock操作先行发生(happen-before)于后面对同一个锁的lock操作”；</li>
</ul>
<h5 id="2-性能"><a href="#2-性能" class="headerlink" title="2.性能"></a>2.性能</h5><p>​	每次对 String 类型进行改变的时候，都会生成一个新的 String 对象，然后将指针指向新的 String 对象。StringBuffer 每次都会对 StringBuffer 对象本身进行操作，而不是生成新的对象并改变对象引用。相同情况下使用 StringBuilder 相比使用 StringBuffer 仅能获得 10%~15% 左右的性能提升，但却要冒多线程不安全的风险。</p>
<h4 id="11-字符串常量池的作用了解吗？"><a href="#11-字符串常量池的作用了解吗？" class="headerlink" title="11.字符串常量池的作用了解吗？"></a>11.字符串常量池的作用了解吗？</h4><p>​	<strong>字符串常量池</strong> 是 JVM 为了提升性能和减少内存消耗针对字符串（String 类）专门开辟的一块区域，主要目的是为了避免字符串的重复创建。</p>
<h4 id="12-intern-方法有什么作用"><a href="#12-intern-方法有什么作用" class="headerlink" title="12.intern 方法有什么作用?"></a>12.intern 方法有什么作用?</h4><p>​	String.intern() 是一个 native（本地）方法，其作用是将指定的字符串对象的引用保存在字符串常量池中，可以简单分为两种情况：</p>
<ul>
<li>如果字符串常量池中保存了对应的字符串对象的引用，就直接返回该引用。</li>
<li>如果字符串常量池中没有保存了对应的字符串对象的引用，那就在常量池中创建一个指向该字符串对象的引用并返回。</li>
</ul>
<h4 id="13-什么是序列化-什么是反序列化"><a href="#13-什么是序列化-什么是反序列化" class="headerlink" title="13.什么是序列化?什么是反序列化?"></a>13.什么是序列化?什么是反序列化?</h4><p>​	如果我们需要持久化 Java 对象比如将 Java 对象保存在文件中，或者在网络传输 Java 对象，这些场景都需要用到序列化。</p>
<p>简单来说：</p>
<ul>
<li>序列化： 将数据结构或对象转换成二进制字节流的过程</li>
<li>反序列化：将在序列化过程中所生成的二进制字节流转换成数据结构或者对象的过程</li>
</ul>
<p>​	对于 Java 这种面向对象编程语言来说，我们序列化的都是对象（Object）也就是实例化后的类(Class)，但是在 C++这种半面向对象的语言中，struct(结构体)定义的是数据结构类型，而 class 对应的是对象类型。<strong>序列化的主要目的是通过网络传输对象或者说是将对象存储到文件系统、数据库、内存中。</strong></p>
<p><a target="_blank" rel="noopener" href="https://javaguide.cn/java/basis/serialization.html">实际开发中有哪些用到序列化和反序列化的场景</a></p>
<h4 id="14-线程、进程、程序"><a href="#14-线程、进程、程序" class="headerlink" title="14.线程、进程、程序"></a>14.线程、进程、程序</h4><ul>
<li>程序(program)：是为完成特定任务、用某种语言编写的一组指令的集合。即指一段静态的代码，静态对象。</li>
<li>进程(process)：是程序的一次执行过程，或是正在运行的一个程序。是一个动态的过程：有它自身的产生、存在和消亡的过程。—生命周期</li>
<li>线程(thread)，进程可进一步细化为线程，是一个程序内部的一条执行路径。⼀个进程在其执⾏的过程中可以产⽣多个线程。与进程不同的是同类的多个线程共享同⼀块内存空间和⼀组系统资源，所以系统在产⽣⼀个线程，或是在各个线程之间作切换⼯作时，负担要⽐进程⼩得多。</li>
</ul>
<h4 id="15-线程的基本状态"><a href="#15-线程的基本状态" class="headerlink" title="15.线程的基本状态"></a>15.线程的基本状态</h4><blockquote>
<p><strong>new  runnable  running  blocked  waiting  time_waiting  terminated</strong></p>
</blockquote>
<p>线程创建之后它将处于 <strong>NEW（新建）</strong> 状态，调⽤ start() ⽅法后开始运⾏，线程这时候处于<strong>RUNNABLE（可运⾏）</strong> 状态。</p>
<p>可运⾏状态的线程获得了 cpu 时间⽚（timeslice）后就处于<strong>RUNNING（运⾏）</strong> 状态。</p>
<p>当线程执⾏ wait() ⽅法之后，线程进⼊ <strong>WAITING（等待）</strong>状态。进⼊等待状态的线程需要依靠其他线程的通知才能够返回到运⾏状态。</p>
<p>⽽ <strong>TIME_WAITING(超时等待)</strong> 状态相当于在等待状态的基础上增加了超时限制，⽐如通过 sleep（ long millis）⽅法或 wait（long millis）⽅法可以将Java 线程置于 <strong>TIME_WAITING</strong> 状态。当超时时间到达后 Java 线程将会返回到 RUNNABLE 状态。</p>
<p>当线程调⽤同步⽅法时，在没有获取到锁的情况下，线程将会进⼊到 <strong>BLOCKED（阻塞）</strong>状态。</p>
<p>线程在执⾏ Runnable 的 run() ⽅法之后将会进⼊到 <strong>TERMINATED（终⽌）</strong> 状态。</p>
<h4 id="16-final关键字"><a href="#16-final关键字" class="headerlink" title="16.final关键字"></a>16.final关键字</h4><p>final 关键字主要⽤在三个地⽅：变量、⽅法、类。</p>
<ol>
<li>对于⼀个 final 变量，如果是基本数据类型的变量，则其数值⼀旦在<strong>初始化之后便不能更改</strong>；如果是引⽤类型的变量，则在对其<strong>初始化之后便不能再让其指向另⼀个对象</strong>。</li>
<li>当⽤ final 修饰⼀个类时，表明这个类不能被继承。final 类中的所有成员⽅法都会被隐式地指定为 final ⽅法。</li>
<li>使⽤ final ⽅法的原因有两个。第⼀个原因是把⽅法锁定，以防任何继承类修改它的含义；第⼆个原因是效率。在早期的 Java 实现版本中，会将 final ⽅法转为内嵌调⽤。但是如果⽅法过于庞⼤，可能看不到内嵌调⽤带来的任何性能提升（现在的 Java 版本已经不需要使⽤final ⽅法进⾏这些优化了）。类中所有的 private ⽅法都隐式地指定为 final。</li>
</ol>
<h4 id="17-java中的异常"><a href="#17-java中的异常" class="headerlink" title="17.java中的异常"></a>17.java中的异常</h4><img src= "/img/cat-loading.gif" data-lazy-src="https://cdn.jsdelivr.net/gh/Monic1e/picb@master/imgForMD/image-20220621085716408.png" alt="image-20220621085716408" style="zoom:67%;" />

<p>在 Java 中，所有的异常都有⼀个共同的祖先 java.lang 包中的 Throwable 类。</p>
<p> Throwable 类有两个重要的⼦类 Exception(异常)和 Error(错误)。 Exception 能被程序本身处理( try catch )， Error 是⽆法处理的(只能尽量避免)。</p>
<p>RuntimeException 及其⼦类都统称为⾮受检查异常，例如： NullPointExecrption 、 NumberFormatException （字符串转换为数字）、 ArrayIndexOutOfBoundsException （数组越界）、 ClassCastException （类型转换错误）、 ArithmeticException （算术错误）等。</p>
<p><strong>异常处理总结</strong></p>
<ul>
<li>try 块： ⽤于捕获异常。其后可接零个或多个 catch 块，如果没有 catch 块，则必须跟⼀个 finally 块。</li>
<li>catch 块： ⽤于处理 try 捕获到的异常。</li>
<li>finally 块： ⽆论是否捕获或处理异常， finally 块⾥的语句都会被执⾏。当在 try 块或catch 块中遇到 return 语句时， finally 语句块将在⽅法返回之前被执⾏。</li>
</ul>
<h4 id="18-反射-reflection"><a href="#18-反射-reflection" class="headerlink" title="18.反射  reflection"></a>18.反射  reflection</h4><img src= "/img/cat-loading.gif" data-lazy-src="https://cdn.jsdelivr.net/gh/Monic1e/picb@master/imgForMD/image-20220621085737593.png" alt="image-20220621085737593" style="zoom: 67%;" />

<p>一个类在内存中只有一个class对象</p>
<p>一个类被加载后，类的整个结构都会被封装在class对象中</p>
<blockquote>
<p>.java—–javac编译———.class——类加载器———Class类对象——创建对象——-new Person()</p>
<p>成员变量 Field     构造方法 Constructor    成员方法 Method</p>
</blockquote>
<p>获取Class对象的方式：</p>
<ul>
<li>Class.forName(全类名)    多用于配置文件，将类名定义在配置文件中，读取文件加载类</li>
<li>类名.class    多用于参数传递</li>
<li>对象.getClass()	多用于对象获取字节码</li>
</ul>
<p>Class对象的功能：</p>
<p>​	获取：成员变量、构造方法、成员方法、类名（getxxx获取public修饰的，getDeclaredxxx获取所有的）</p>
<p>Constructor对象功能：</p>
<p>​	创建对象    newInstance(参数)</p>
<p>Method对象的功能：</p>
<p>​	执行方法   invoke</p>
<p>应用场景：</p>
<p>​	在编译时根本无法知道该对象或类可能属于哪些类，程序只依靠运行时信息来发现该对象和类的真实信息.</p>
</article><div class="post-copyright"><div class="post-copyright__author"><span class="post-copyright-meta">文章作者: </span><span class="post-copyright-info"><a href="https://soda124.gitee.io">ShiMH</a></span></div><div class="post-copyright__type"><span class="post-copyright-meta">文章链接: </span><span class="post-copyright-info"><a href="https://soda124.gitee.io/articles/5920252e.html">https://soda124.gitee.io/articles/5920252e.html</a></span></div><div class="post-copyright__notice"><span class="post-copyright-meta">版权声明: </span><span class="post-copyright-info">本博客所有文章除特别声明外，均采用 <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/" target="_blank">CC BY-NC-SA 4.0</a> 许可协议。转载请注明来自 <a href="https://soda124.gitee.io" target="_blank">SodaSoda</a>！</span></div></div><div class="tag_share"><div class="post-meta__tag-list"></div><div class="post_share"><div class="social-share" data-image="/img/star.jpeg" data-sites="facebook,twitter,wechat,weibo,qq"></div><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/social-share.js/dist/css/share.min.css" media="print" onload="this.media='all'"><script src="https://cdn.jsdelivr.net/gh/overtrue/share.js@master/dist/js/social-share.min.js" defer></script></div></div><nav class="pagination-post" id="pagination"><div class="prev-post pull-left"><a href="/articles/9505f082.html"><img class="prev-cover" src= "/img/cat-loading.gif" data-lazy-src="/img/star.jpeg" onerror="onerror=null;src='/img/404.jpg'" alt="cover of previous post"><div class="pagination-info"><div class="label">上一篇</div><div class="prev_info">面试题--数据库</div></div></a></div><div class="next-post pull-right"><a href="/articles/cf0854e3.html"><img class="next-cover" src= "/img/cat-loading.gif" data-lazy-src="/img/star.jpeg" onerror="onerror=null;src='/img/404.jpg'" alt="cover of next post"><div class="pagination-info"><div class="label">下一篇</div><div class="next_info">面试题--Redis</div></div></a></div></nav></div><div class="aside-content" id="aside-content"><div class="card-widget card-info"><div class="is-center"><div class="avatar-img"><img src= "/img/cat-loading.gif" data-lazy-src="/img/profileIcon.jpg" onerror="this.onerror=null;this.src='/img/friend_404.gif'" alt="avatar"/></div><div class="author-info__name">ShiMH</div><div class="author-info__description">未完待续</div></div><div class="card-info-data site-data is-center"><a href="/archives/"><div class="headline">文章</div><div class="length-num">9</div></a><a href="/tags/"><div class="headline">标签</div><div class="length-num">0</div></a><a href="/categories/"><div class="headline">分类</div><div class="length-num">5</div></a></div><a id="card-info-btn" target="_blank" rel="noopener" href="https://github.com/xxxxxx"><i class="fab fa-github"></i><span>Follow Me</span></a><div class="card-info-social-icons is-center"><a class="social-icon" href="mailto:xxxxxx@gmail.com" target="_blank" title="Email"><i class="fas fa-envelope"></i></a></div></div><div class="card-widget card-announcement"><div class="item-headline"><i class="fas fa-bullhorn fa-shake"></i><span>公告</span></div><div class="announcement_content">来日方长</div></div><div class="sticky_layout"><div class="card-widget" id="card-toc"><div class="item-headline"><i class="fas fa-stream"></i><span>目录</span><span class="toc-percentage"></span></div><div class="toc-content"><ol class="toc"><li class="toc-item toc-level-4"><a class="toc-link" href="#1-Java%E8%AF%AD%E8%A8%80%E7%9A%84%E7%89%B9%E7%82%B9"><span class="toc-number">1.</span> <span class="toc-text">1.Java语言的特点</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#2-JVM-JRE-JDK"><span class="toc-number">2.</span> <span class="toc-text">2. JVM  JRE  JDK</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#3-Java%E5%92%8CC-%E7%9A%84%E5%8C%BA%E5%88%AB"><span class="toc-number">3.</span> <span class="toc-text">3. Java和C++的区别</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#4-%E5%AD%97%E7%AC%A6%E5%9E%8B%E5%B8%B8%E9%87%8F%EF%BC%88%E2%80%99-%E2%80%98%EF%BC%89%E5%92%8C%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%B8%B8%E9%87%8F%EF%BC%88%E2%80%9D-%E2%80%9C%EF%BC%89%E7%9A%84%E5%8C%BA%E5%88%AB"><span class="toc-number">4.</span> <span class="toc-text">4.字符型常量（’ ‘）和字符串常量（” “）的区别?</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#5-%E9%9D%99%E6%80%81%E6%96%B9%E6%B3%95%E4%B8%BA%E4%BB%80%E4%B9%88%E4%B8%8D%E8%83%BD%E8%B0%83%E7%94%A8%E9%9D%9E%E9%9D%99%E6%80%81%E6%88%90%E5%91%98"><span class="toc-number">5.</span> <span class="toc-text">5.静态方法为什么不能调用非静态成员?</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#6-%E5%9F%BA%E6%9C%AC%E7%B1%BB%E5%9E%8B%E5%92%8C%E5%8C%85%E8%A3%85%E7%B1%BB%E5%9E%8B%E7%9A%84%E5%8C%BA%E5%88%AB%EF%BC%9F"><span class="toc-number">6.</span> <span class="toc-text">6.基本类型和包装类型的区别？</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#7-%E5%8C%85%E8%A3%85%E7%B1%BB%E5%9E%8B%E7%9A%84%E5%B8%B8%E9%87%8F%E6%B1%A0%E6%8A%80%E6%9C%AF%E4%BA%86%E8%A7%A3%E4%B9%88%EF%BC%9F"><span class="toc-number">7.</span> <span class="toc-text">7.包装类型的常量池技术了解么？</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#9-x3D-x3D-%E5%92%8C-equals-%E7%9A%84%E5%8C%BA%E5%88%AB"><span class="toc-number">8.</span> <span class="toc-text">9.&#x3D;&#x3D; 和 equals() 的区别</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#10-String-StringBuffer-StringBuilder"><span class="toc-number">9.</span> <span class="toc-text">10.String StringBuffer  StringBuilder</span></a><ol class="toc-child"><li class="toc-item toc-level-5"><a class="toc-link" href="#1-%E7%BA%BF%E7%A8%8B%E5%AE%89%E5%85%A8%E6%80%A7"><span class="toc-number">9.1.</span> <span class="toc-text">1.线程安全性</span></a></li><li class="toc-item toc-level-5"><a class="toc-link" href="#2-%E6%80%A7%E8%83%BD"><span class="toc-number">9.2.</span> <span class="toc-text">2.性能</span></a></li></ol></li><li class="toc-item toc-level-4"><a class="toc-link" href="#11-%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%B8%B8%E9%87%8F%E6%B1%A0%E7%9A%84%E4%BD%9C%E7%94%A8%E4%BA%86%E8%A7%A3%E5%90%97%EF%BC%9F"><span class="toc-number">10.</span> <span class="toc-text">11.字符串常量池的作用了解吗？</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#12-intern-%E6%96%B9%E6%B3%95%E6%9C%89%E4%BB%80%E4%B9%88%E4%BD%9C%E7%94%A8"><span class="toc-number">11.</span> <span class="toc-text">12.intern 方法有什么作用?</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#13-%E4%BB%80%E4%B9%88%E6%98%AF%E5%BA%8F%E5%88%97%E5%8C%96-%E4%BB%80%E4%B9%88%E6%98%AF%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96"><span class="toc-number">12.</span> <span class="toc-text">13.什么是序列化?什么是反序列化?</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#14-%E7%BA%BF%E7%A8%8B%E3%80%81%E8%BF%9B%E7%A8%8B%E3%80%81%E7%A8%8B%E5%BA%8F"><span class="toc-number">13.</span> <span class="toc-text">14.线程、进程、程序</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#15-%E7%BA%BF%E7%A8%8B%E7%9A%84%E5%9F%BA%E6%9C%AC%E7%8A%B6%E6%80%81"><span class="toc-number">14.</span> <span class="toc-text">15.线程的基本状态</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#16-final%E5%85%B3%E9%94%AE%E5%AD%97"><span class="toc-number">15.</span> <span class="toc-text">16.final关键字</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#17-java%E4%B8%AD%E7%9A%84%E5%BC%82%E5%B8%B8"><span class="toc-number">16.</span> <span class="toc-text">17.java中的异常</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#18-%E5%8F%8D%E5%B0%84-reflection"><span class="toc-number">17.</span> <span class="toc-text">18.反射  reflection</span></a></li></ol></div></div><div class="card-widget card-recent-post"><div class="item-headline"><i class="fas fa-history"></i><span>最新文章</span></div><div class="aside-list"><div class="aside-list-item no-cover"><div class="content"><a class="title" href="/articles/b8631032.html" title="信息加解密">信息加解密</a><time datetime="2022-08-26T00:00:00.000Z" title="发表于 2022-08-26 08:00:00">2022-08-26</time></div></div><div class="aside-list-item no-cover"><div class="content"><a class="title" href="/articles/f119c603.html" title="AOP面向切面编程">AOP面向切面编程</a><time datetime="2022-08-25T09:06:00.000Z" title="发表于 2022-08-25 17:06:00">2022-08-25</time></div></div><div class="aside-list-item no-cover"><div class="content"><a class="title" href="/articles/e1945976.html" title="Vue--父子传值">Vue--父子传值</a><time datetime="2022-07-28T04:30:00.000Z" title="发表于 2022-07-28 12:30:00">2022-07-28</time></div></div><div class="aside-list-item no-cover"><div class="content"><a class="title" href="/articles/40393ae2.html" title="面试题--Java算法">面试题--Java算法</a><time datetime="2022-07-28T04:00:00.000Z" title="发表于 2022-07-28 12:00:00">2022-07-28</time></div></div><div class="aside-list-item no-cover"><div class="content"><a class="title" href="/articles/b7aade44.html" title="面试题--MySQL">面试题--MySQL</a><time datetime="2022-06-21T00:31:16.000Z" title="发表于 2022-06-21 08:31:16">2022-06-21</time></div></div></div></div></div></div></main><footer id="footer" style="background-image: url('/img/star.jpeg')"><div id="footer-wrap"><div class="copyright">&copy;2022  <i id="heartbeat" class="fa fas fa-heartbeat"></i> ShiMH</div><div class="framework-info"><span>框架 </span><a target="_blank" rel="noopener" href="https://hexo.io">Hexo</a><span class="footer-separator">|</span><span>主题 </span><a target="_blank" rel="noopener" href="https://github.com/jerryc127/hexo-theme-butterfly">Butterfly</a></div></div><link rel="stylesheet" href="https://fastly.jsdelivr.net/gh/HCLonely/images@master/others/heartbeat.min.css"></footer></div><div id="rightside"><div id="rightside-config-hide"><button id="readmode" type="button" title="阅读模式"><i class="fas fa-book-open"></i></button><button id="darkmode" type="button" title="浅色和深色模式转换"><i class="fas fa-adjust"></i></button><button id="hide-aside-btn" type="button" title="单栏和双栏切换"><i class="fas fa-arrows-alt-h"></i></button></div><div id="rightside-config-show"><button id="rightside_config" type="button" title="设置"><i class="fas fa-cog fa-spin"></i></button><button class="close" id="mobile-toc-button" type="button" title="目录"><i class="fas fa-list-ul"></i></button><button id="go-up" type="button" title="回到顶部"><i class="fas fa-arrow-up"></i></button></div></div><div><script src="/js/utils.js"></script><script src="/js/main.js"></script><script src="https://cdn.jsdelivr.net/npm/@fancyapps/ui/dist/fancybox.umd.js"></script><script src="https://cdn.jsdelivr.net/npm/vanilla-lazyload/dist/lazyload.iife.min.js"></script><script async="async">var preloader = {
  endLoading: () => {
    document.body.style.overflow = 'auto';
    document.getElementById('loading-box').style.transition = 'opacity 3s ease 0s'
    document.getElementById('loading-box').style.opacity = '0'
    setTimeout(function(){
      document.getElementById('loading-box').classList.add("loaded")
    }, 3000);
  },
  initLoading: () => {
    document.body.style.overflow = '';
    document.getElementById('loading-box').style.transition = '';
    document.getElementById('loading-box').style.opacity = '1'
    document.getElementById('loading-box').classList.remove("loaded")

  }
}
window.addEventListener('load',()=> {preloader.endLoading()})
setTimeout(function(){preloader.endLoading();}, 3000);</script><div class="js-pjax"></div><canvas id="universe"></canvas><script defer src="/js/universe.js"></script><script defer src="/js/heart.js"></script><script id="click-heart" src="https://cdn.jsdelivr.net/npm/butterfly-extsrc@1/dist/click-heart.min.js" async="async" mobile="false"></script><script src="https://cdn.jsdelivr.net/npm/pjax/pjax.min.js"></script><script>let pjaxSelectors = ["head > title","#config-diff","#body-wrap","#rightside-config-hide","#rightside-config-show",".js-pjax"]

var pjax = new Pjax({
  elements: 'a:not([target="_blank"])',
  selectors: pjaxSelectors,
  cacheBust: false,
  analytics: false,
  scrollRestoration: false
})

document.addEventListener('pjax:send', function () {

  // removeEventListener scroll 
  window.tocScrollFn && window.removeEventListener('scroll', window.tocScrollFn)
  window.scrollCollect && window.removeEventListener('scroll', scrollCollect)

  typeof preloader === 'object' && preloader.initLoading()
  document.getElementById('rightside').style.cssText = "opacity: ''; transform: ''"
  
  if (window.aplayers) {
    for (let i = 0; i < window.aplayers.length; i++) {
      if (!window.aplayers[i].options.fixed) {
        window.aplayers[i].destroy()
      }
    }
  }

  typeof typed === 'object' && typed.destroy()

  //reset readmode
  const $bodyClassList = document.body.classList
  $bodyClassList.contains('read-mode') && $bodyClassList.remove('read-mode')

})

document.addEventListener('pjax:complete', function () {
  window.refreshFn()

  document.querySelectorAll('script[data-pjax]').forEach(item => {
    const newScript = document.createElement('script')
    const content = item.text || item.textContent || item.innerHTML || ""
    Array.from(item.attributes).forEach(attr => newScript.setAttribute(attr.name, attr.value))
    newScript.appendChild(document.createTextNode(content))
    item.parentNode.replaceChild(newScript, item)
  })

  GLOBAL_CONFIG.islazyload && window.lazyLoadInstance.update()

  typeof chatBtnFn === 'function' && chatBtnFn()
  typeof panguInit === 'function' && panguInit()

  // google analytics
  typeof gtag === 'function' && gtag('config', '', {'page_path': window.location.pathname});

  // baidu analytics
  typeof _hmt === 'object' && _hmt.push(['_trackPageview',window.location.pathname]);

  typeof loadMeting === 'function' && document.getElementsByClassName('aplayer').length && loadMeting()

  // prismjs
  typeof Prism === 'object' && Prism.highlightAll()

  typeof preloader === 'object' && preloader.endLoading()
})

document.addEventListener('pjax:error', (e) => {
  if (e.request.status === 404) {
    pjax.loadUrl('/404.html')
  }
})</script></div><!-- hexo injector body_end start --><script data-pjax>
  function butterfly_clock_injector_config(){
    var parent_div_git = document.getElementsByClassName('sticky_layout')[0];
    var item_html = '<div class="card-widget card-clock"><div class="card-glass"><div class="card-background"><div class="card-content"><div id="hexo_electric_clock"><img class="entered loading" id="card-clock-loading" src= "/img/cat-loading.gif" data-lazy-src="https://github.com/Monic1e/picb/tree/master/loading.gif" style="height: 120px; width: 100%;" data-ll-status="loading"/></div></div></div></div></div>';
    console.log('已挂载butterfly_clock')
    parent_div_git.insertAdjacentHTML("afterbegin",item_html)
    }
  var elist = 'null'.split(',');
  var cpage = location.pathname;
  var epage = 'all';
  var flag = 0;

  for (var i=0;i<elist.length;i++){
    if (cpage.includes(elist[i])){
      flag++;
    }
  }

  if ((epage ==='all')&&(flag == 0)){
    butterfly_clock_injector_config();
  }
  else if (epage === cpage){
    butterfly_clock_injector_config();
  }
  </script><script src="https://pv.sohu.com/cityjson?ie=utf-8"></script><script data-pjax src="https://unpkg.zhimg.com/hexo-butterfly-clock/lib/clock.min.js"></script><!-- hexo injector body_end end --></body></html>